<?php
/**
 * Created by PhpStorm.
 * User: Phantom
 * Date: 24/07/14
 * Time: 18:00
 */
class ManagerBDD{

    /**
     * Cette fonction permet de faire un select dans la BDD
     * @param  $classe
     */
    public static function doSelect($class,$count=false,$conditions=array(),$offset=null,$limit=null,$orderbys=array()){
        if(strpos($class,'Fk_')===0){// start with fk_
            $class =substr($class,3); // supression de fk_
        }
        $requete="SELECT ";

        // si c'est une requête pour faire un count alors rentre ici sinon boucle sur les atributs
        if($count){
            $requete.=" count(*) ";
        }else{
            //recherche les champs qui sont dans la classe qui sont aussi les noms de colonne de la table
            foreach($class::mapping(null) as $name => $value){
                $requete.=$name.", ";
            }
            // suression de ", " virgule et espace
            $requete=substr($requete,0,-2);
        }

        // ajout le from et la class qui est aussi le nom de la table en bdd lowercase
        $requete.=" FROM ".strtolower($class)." ";

        // Gestion de la clause where
        if(sizeof($conditions)!=0){
            $requete.=' WHERE ';
            foreach($conditions as $name => $value){
                $requete.="`".$name."`='".$value."' AND ";
            }
            $requete=substr($requete,0,-4);
        }
        $connexion = ConnexionBDD::getInstancePDO();
        $req = $connexion->prepare($requete);
        $req->execute();

        $resultat = null;
        // dans le cas d'un count il n'y a q'une ligne
        if($count){
            $reg = $req->fetchAll();
            return $reg[0][0];

        }else{
            $objs=array();
            // c'est des objet!

            $reg = $req->fetchAll();
            $reflect = new ReflectionClass($class);
            // pour chaques lignes
            foreach($reg as $row){
                $obj = $reflect->newInstanceArgs(array(0));
                // chaque valeurs
                foreach($class::mapping(null)as $name=>$value){
                    if(strpos($name,'fk_')===0){// gestion du sous objet. seul le niveau 1 est fait pour le moment
                        self::doSelect(ucfirst($name),false,array('id'=>$row[$name]));
                        call_user_func(array($obj,'set'.ucWords(substr($name,3))),self::doSelect(ucfirst($name),false,array('id'=>$row[$name]))[0]);
                    }else{
                        call_user_func(array($obj,'set'.ucWords($name)),$row[$name]);
                    }
                }
                $objs[]=$obj; // ajout dans le tableau general
            }
            return $objs; // Retourne un tableau d'objet de la classe qui est passé en paramètre.
        }
    }

    /**
     * Cette fonction permet de faire un ajout dans la base de donnée avec un objet qui est passé en paramètre
     * @param $Object
     *
     * Cette fonction retourne aussi l'id de la personne (il faudra faire un set de l'id sur l'objet)
     * @return $id;
     */
    public static function doInsert($Object){
        $requete="INSERT INTO `".strtolower(get_class($Object))."` (";
        $column="";
        $values="";
        // boucle sur l'objet pour prendre attribues et valeurs
        foreach($Object->mapping($Object) as $name=>$value){
            $column.="`".$name."`, ";
            if(strpos($name,'fk_')===0 && $value->getId()!=null){ // insert uniquement la valeur fk_ pas l'objet en bdd
                $values.="'".$value->getId()."', ";
            }else{
                $values.="'".$value."', ";
            }
        }
        // Supression des ',' de fin de chaine sinon plantage :-)
        $column=substr($column,0,-2);
        $values=substr($values,0,-2);
        $requete.=$column.")"." VALUES( ".$values.")";

        // recherche de l'instance PDO et execution
        $connexion = ConnexionBDD::getInstancePDO();
        $req = $connexion->prepare($requete);
        $retour= $req->execute();
        $id = $connexion->lastInsertId(); // return l'id de la nouvelle ligne
        return $id;
    }



    public static function doDelete($Object,$class=null,$conditions=array()){
        if($class==null && sizeof($conditions)==0 && $Object!=null){
            $requete="DELETE FROM `".strtolower(get_class($Object))."` WHERE `id`=".$Object->getId();
        }
        elseif($class!=null && sizeof($conditions)!=0){
            $requete="DELETE FROM `".strtolower($class)."` WHERE ";

            // Gestion de la clause where
            foreach($conditions as $name => $value){
                $requete.="`".$name."`=".$value;
            }
        }
        // recherche de l'instance PDO et execution
        $connexion = ConnexionBDD::getInstancePDO();
        $req = $connexion->prepare($requete);
        $req->execute();
        return $req->rowCount();
    }
}